/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.ucue.ptc.gco.ui;

import edu.ucue.ptc.gco.mdl.Direccion;
import edu.ucue.ptc.gco.mdl.Empleado;
import edu.ucue.ptc.gco.mdl.Ruta;
import edu.ucue.ptc.gco.ngc.DireccionManagerLocal;
import edu.ucue.ptc.gco.ngc.EmpleadoManagerLocal;
import edu.ucue.ptc.gco.ngc.RutaManagerLocal;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.el.ELContext;
import javax.el.ValueExpression;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import org.primefaces.model.SelectableDataModel;
import org.primefaces.model.map.DefaultMapModel;
import org.primefaces.model.map.LatLng;
import org.primefaces.model.map.MapModel;
import org.primefaces.model.map.Marker;

/**
 *
 * @author CHRISTIAN
 */
@Named(value="rutaAction")
@SessionScoped
public class RutaAction implements Serializable{
    private Empleado empleado;
    private Date fecha;
    private List<Direccion> direcciones;
    //private ListDataModel<Ruta> rutas;
    private List<Ruta> rutas;
    private MapModel mapModel;
    private Ruta rutaSeleccionada;
    private Ruta rutaSelect;
    private String cedulaEmpleado;
    private String mensajeBusquedaEmpleado;
    private String mensajeRuta;
    private Direccion direccion;
    private List<Direccion> direccionAuxiliar;
    private List<Direccion> direccionPreload;
    private String mensajeRutaSimple;
    SelectableDataModel<Ruta> datamodel;
        
    @Inject
    private RutaManagerLocal rutaManager;
    
    @Inject 
    private EmpleadoManagerLocal empleadoManager;     
     
    @Inject 
    private DireccionManagerLocal direccionManager;

    public static RutaAction getInstance()
    {
        ELContext context = FacesContext.getCurrentInstance().getELContext();
        ValueExpression ex = FacesContext.getCurrentInstance().getApplication().getExpressionFactory().
                createValueExpression(context, "#{rutaAction}", RutaAction.class);
        return (RutaAction)ex.getValue(context);
    }
    
    @PostConstruct
    public void init() {
        try {
            limpiarRutaSingle();
            rutas=rutaManager.listarTodos();
            direccionPreload=direccionManager.listarTodos(LoginAction.getUsername(),LoginAction.getPassword());
            
            
        } catch (Exception ex) {
            Logger.getLogger(RutaAction.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    
    public String onRowSelect(Ruta ruta) {  
        limpiarRutaSingle();
        rutaSeleccionada=ruta;//(Ruta)datamodel.getRowData(String.valueOf(((Ruta)event.getObject()).getIdRuta()));  
        empleado= rutaSeleccionada.getEmpleado();
        fecha=rutaSeleccionada.getFecha();
        direcciones=rutaManager.obtenerDireccionRutaPorId(ruta.getIdRuta());//      rutaSeleccionada.getDirecciones();
        quitarDireccionesExistentes();
        cargarMapa();
        return "rutasingular";
    } 
    
    public void quitarDireccionesExistentes(){
        direccionPreload.removeAll(direcciones);
    }
    
    public void verRuta(Ruta ruta){
        limpiarRutaSingle();
        rutaSeleccionada=ruta;//(Ruta)datamodel.getRowData(String.valueOf(((Ruta)event.getObject()).getIdRuta()));  
        empleado= rutaSeleccionada.getEmpleado();
        direcciones=rutaManager.obtenerDireccionRutaPorId(ruta.getIdRuta());//      rutaSeleccionada.getDirecciones();
        cargarMapa();
        //return "";
    }
    
    public String buscarEmpleado(){
        try{
            Empleado emp=empleadoManager.buscarEmpleadoPorCedula(cedulaEmpleado, LoginAction.getUsername(), LoginAction.getPassword());
            if (emp!=null){
                setEmpleado(emp);
            }else{
                setMensajeBusquedaEmpleado("El empleado no fue encontrado");            
            }
            return "";
        }
        catch(Exception e){
            e.printStackTrace();
            return "";
        }
    }
    
    public String agregarDirecciones(){
        if (direccionAuxiliar==null || direccionAuxiliar.isEmpty()){}
        else{
            for (Direccion dir:direccionAuxiliar){
                direcciones.add(dir);
            }
        }
        return "";
    }
    
    public String seleccionarDireccion(Direccion dir){
        if (direcciones==null){
            direcciones=new ArrayList<Direccion>();
        }
        
        if (rutaSeleccionada.getIdRuta()!=0){
            rutaManager.agregarDireccion(rutaSeleccionada.getIdRuta(), dir);
        }
        
        direcciones.add(dir);
        cargarMapa();
        direccionPreload.remove(dir);
        return "";
    }
    
    public String nuevaRuta(){
        fecha=null;
        direcciones=new ArrayList<Direccion>();
        direccionAuxiliar=new ArrayList<Direccion>();
        rutaSeleccionada=new Ruta();
        empleado=new Empleado();
        setCedulaEmpleado("");
        setMensajeBusquedaEmpleado("");
        mapModel=new DefaultMapModel();
        try{
            direccionPreload=direccionManager.listarTodos(LoginAction.getUsername(),LoginAction.getPassword());
        }catch(Exception e){
            e.printStackTrace();
        }
        return "rutasingular";
    }
    
    public void cargarMapa(){
        //Shared coordinates  
        mapModel=new DefaultMapModel();
        if (direcciones==null || direcciones.isEmpty()){}
        else{
            for (Direccion dir:direcciones){
                LatLng coord1 = new LatLng(Double.valueOf(dir.getLatitud()), Double.valueOf(dir.getLongitud())); 
                mapModel.addOverlay(new Marker(coord1, dir.getPersona().getNombres()+" "+dir.getPersona().getApellidos())); 
            }
        }
         
    }
    
    public void limpiarRutaSingle(){
        empleado=new Empleado();
        direcciones=new ArrayList<Direccion>();
        direccionAuxiliar=new ArrayList<Direccion>();
        fecha=null;
        mapModel=new DefaultMapModel();
        setMensajeBusquedaEmpleado("");
        rutaSeleccionada=new Ruta();
        rutaSelect=new Ruta();
    }
    
    public String grabarRuta(){
        rutaSeleccionada.setEmpleado(empleado);
        rutaSeleccionada.setFecha(fecha);
        //
        try{
            if (rutaSeleccionada.getIdRuta()<1){
                rutaManager.crear(rutaSeleccionada,direcciones,LoginAction.getUsername(),LoginAction.getPassword());
            }
            else{
                rutaSeleccionada.setDirecciones(direcciones);
                rutaManager.actualizar(rutaSeleccionada,LoginAction.getUsername(),LoginAction.getPassword());
            }
            limpiarRutaSingle();
            init();
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(null, "La ruta ha sido guardada con exito"));
            return "ruta";
        }
        catch(Exception e){
            e.printStackTrace();
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(null, "No se ha podido ingresar la ruta"));
            return "";
        }
    }
    
    public String regresarRuta(){
        limpiarRutaSingle();
        return "ruta";
    }
    
    public String eliminarDireccion(Direccion direc){    
        direccion=direc;
        if (direccion==null){
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(null, "No se pudo eliminar la direccion"));
        }
        else{
            try{
                if (rutaSeleccionada.getIdRuta()!=0){
                    rutaManager.quitarDireccion(rutaSeleccionada.getIdRuta(), direc);
                }
                
               direcciones.remove(direccion);
               direccionPreload.add(direccion);
               cargarMapa();
            }
            catch(Exception e){
                e.printStackTrace();
            }
        }
        return "";
    }
    
    public String eliminarRuta(Ruta ruta){
            rutaSelect=ruta;
        if (rutaSelect!=null){
            rutaManager.eliminar(rutaSelect);
            init();
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(null, "La ruta se elimino con exito"));
        }
        else{
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(null, "La ruta no pudo ser eliminada"));
        }
        return "";
    }
    
    public Empleado getEmpleado() {
        return empleado;
    }

    public void setEmpleado(Empleado empleado) {
        this.empleado = empleado;
    }

    public Date getFecha() {
        return fecha;
    }

    public void setFecha(Date fecha) {
        this.fecha = fecha;
    }

    public List<Direccion> getDirecciones() {
        return direcciones;
    }

    public void setDirecciones(List<Direccion> direcciones) {
        this.direcciones = direcciones;
    }

    public List<Ruta> getRutas() {
        return rutas;
    }

    public void setRutas(List<Ruta> rutas) {
        this.rutas = rutas;
    }

    public Ruta getRutaSeleccionada() {
        return rutaSeleccionada;
    }

    public void setRutaSeleccionada(Ruta rutaSeleccionada) {
        this.rutaSeleccionada = rutaSeleccionada;
    }

    public MapModel getMapModel() {
        return mapModel;
    }

    public void setMapModel(MapModel mapModel) {
        this.mapModel = mapModel;
    }

    public String getCedulaEmpleado() {
        return cedulaEmpleado;
    }

    public void setCedulaEmpleado(String cedulaEmpleado) {
        this.cedulaEmpleado = cedulaEmpleado;
    }

    public String getMensajeBusquedaEmpleado() {
        return mensajeBusquedaEmpleado;
    }

    public void setMensajeBusquedaEmpleado(String mensajeBusquedaEmpleado) {
        this.mensajeBusquedaEmpleado = mensajeBusquedaEmpleado;
    }

    public Direccion getDireccion() {
        return direccion;
    }

    public void setDireccion(Direccion direccion) {
        this.direccion = direccion;
    }

    public List<Direccion> getDireccionAuxiliar() {
        return direccionAuxiliar;
    }

    public void setDireccionAuxiliar(List<Direccion> direccionAuxiliar) {
        this.direccionAuxiliar = direccionAuxiliar;
    }

    public Ruta getRutaSelect() {
        return rutaSelect;
    }

    public void setRutaSelect(Ruta rutaSelect) {
        this.rutaSelect = rutaSelect;
    }

    public String getMensajeRuta() {
        return mensajeRuta;
    }

    public void setMensajeRutaSimple(String mensajeRuta) {
        this.mensajeRuta = mensajeRuta;
    }

    public String getMensajeRutaSimple() {
        return mensajeRutaSimple;
    }

    public void setMensajeSimple(String mensajeRutaSimple) {
        this.mensajeRutaSimple = mensajeRutaSimple;
    }

    public SelectableDataModel getDatamodel() {
        return datamodel;
    }

    public void setDatamodel(SelectableDataModel datamodel) {
        this.datamodel = datamodel;
    }

    public List<Direccion> getDireccionPreload() {
        return direccionPreload;
    }

    public void setDireccionPreload(List<Direccion> direccionPreload) {
        this.direccionPreload = direccionPreload;
    }
    
    
}
